﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Transactions;

using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class ConfiguracaoRegraLegal
    {
        #region Variaveis Membro
        private int _idConfiguracaoRegraLegal;
        private TipoBeneficio _beneficio;
        private DateTime _dtInicio;
        private DateTime _dtFim;
        private Status _status;
        private decimal _valor;
        private TipoValor _tipoValor;
        private string _obrigatorio;
        private string _extensivoDependente;
        private string _descontoFolha;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdConfiguracaoRegraLegal
        {
            get { return _idConfiguracaoRegraLegal; }
            set { _idConfiguracaoRegraLegal = value; }
        }
        
        public TipoBeneficio Beneficio
        {
            get { return _beneficio; }
            set { _beneficio = value; }
        }

        public DateTime DtInicio
        {
            get { return _dtInicio; }
            set { _dtInicio = value; }
        }

        public DateTime DtFim
        {
            get { return _dtFim; }
            set { _dtFim = value; }
        }
        
        public Status Status
        {
            get { return _status; }
            set { _status = value; }
        }
        
        public decimal Valor
        {
            get { return _valor; }
            set { _valor = value; }
        }

        public TipoValor TipoValor
        {
            get { return _tipoValor; }
            set { _tipoValor = value; }
        }

        public string Obrigatorio
        {
            get { return _obrigatorio; }
            set { _obrigatorio = value; }
        }

        public string ExtensivoDependente
        {
            get { return _extensivoDependente; }
            set { _extensivoDependente = value; }
        }

        public string DescontoFolha
        {
            get { return _descontoFolha; }
            set { _descontoFolha = value; }
        }
        #endregion

        #region Construtores
        public ConfiguracaoRegraLegal()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public ConfiguracaoRegraLegal(int idConfiguracaoRegraLegal, bool carregaDados)
        {
            try
            {
                _context = new GENTEEntities();
                if (!carregaDados)
                    this._idConfiguracaoRegraLegal = idConfiguracaoRegraLegal;
                else
                    Carregar(idConfiguracaoRegraLegal);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos Privados

        #region Métodos Gerais
        private void VerificarCadastro()
        {
            try
            {
                if (this._beneficio == null)
                    throw new Exception("É necessário informar o benefício dessa configuração!");

                if (this._beneficio.IdTipoBeneficio == 0)
                    throw new Exception("É necessário informar o benefício dessa configuração!");

                if (this._status == null)
                    throw new Exception("É necessário informar qual a situação da configuração!");

                if (this._status.IdStatus == 0)
                    throw new Exception("É necessário informar qual a situação da configuração!");

                if (this._dtFim < this._dtInicio)
                    throw new Exception("É necessário informar para o campo Data Final do período de Validade uma data maior daquela que se encontra no campo Data Inicial!");

                if (this._tipoValor == null)
                    throw new Exception("É necessário informar o tipo de valor utilizado pela configuração!");

                if (this._tipoValor.IdTipoValor == 0)
                    throw new Exception("É necessário informar o tipo de valor utilizado pela configuração!");

                if (this._valor == 0)
                {
                    switch (this._tipoValor.IdTipoValor)
                    {
                        case (int)TipoValor.Tipo.Porcentagem:
                            throw new Exception("É necessário informar o valor em porcentagem utilizado pela configuração!");
                        case (int)TipoValor.Tipo.Dinheiro:
                            throw new Exception("É necessário informar o valor em dinheiro utilizado pela configuração!");
                        case (int)TipoValor.Tipo.Unidade:
                            throw new Exception("É necessário informar o valor em unidade utilizado pela configuração!");
                    }
                }

                if (this._obrigatorio == string.Empty)
                    throw new Exception("É necessário informar a obrigatoriedade dessa configuração!");

                if (this._extensivoDependente == string.Empty)
                    throw new Exception("É necessário informar se essa configuração é extendida para os dependentes!");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos de Seleção
        private void Carregar(int idConfiguracaoRegraLegal)
        {
            try
            {
                var consulta = (from config in _context.tab_configuracao_regra_legal
                                where config.id_configuracao_regra_legal == idConfiguracaoRegraLegal
                                select new
                                {
                                    config.id_configuracao_regra_legal,
                                    config.dt_inicio,
                                    config.dt_fim,
                                    config.valor,
                                    config.obrigatorio,
                                    config.extensivo_dependente
                                });

                var listConsulta = consulta.ToList();

                foreach(var list in listConsulta)
                {
                    this._idConfiguracaoRegraLegal = list.id_configuracao_regra_legal;
                    this._dtInicio = list.dt_inicio;
                    this._dtFim = list.dt_fim;
                    this._valor = list.valor;
                    this._obrigatorio = list.obrigatorio;
                    this._extensivoDependente = list.extensivo_dependente;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private int RetornaIdConfiguracaoRegraLegal()
        {
            try
            {
                int resultado = 0;

                var consulta = (from config in _context.tab_configuracao_regra_legal
                                orderby config.id_configuracao_regra_legal descending
                                select new
                                {
                                    config.id_configuracao_regra_legal
                                }).Take(1);

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    resultado = list.id_configuracao_regra_legal;
                }

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos de Persistência
        private void DesativarConfiguracaoAnterior(int idConfiguracaoRegraLegal, int idBeneficio)
        {
            try
            {
                var consulta = (from config in _context.tab_configuracao_regra_legal
                                where config.id_configuracao_regra_legal < idConfiguracaoRegraLegal
                                && config.tab_tipo_beneficio.id_tipo_beneficio == idBeneficio
                                orderby config.id_configuracao_regra_legal descending
                                select config).Take(1);

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    tab_configuracao_regra_legal tabConfiguracaoRegraLegal = (from config in _context.tab_configuracao_regra_legal
                                                                              where config.id_configuracao_regra_legal == list.id_configuracao_regra_legal
                                                                              select config).First();

                    tabConfiguracaoRegraLegal.tab_statusReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status", "id_status", 2);

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion

        #region Métodos Públicos

        #region Métodos de Seleção
        public List<ConfiguracaoRegraLegal> SelectRegraAtual(int idBeneficio)
        {
            try
            {
                List<ConfiguracaoRegraLegal> listConfigLegal = new List<ConfiguracaoRegraLegal>();

                var consulta = (from config in _context.tab_configuracao_regra_legal
                                where config.tab_tipo_beneficio.id_tipo_beneficio == idBeneficio
                                orderby config.id_configuracao_regra_legal descending
                                select new
                                {
                                    config.id_configuracao_regra_legal,
                                    config.dt_inicio,
                                    config.dt_fim,
                                    config.valor,
                                    config.obrigatorio,
                                    config.extensivo_dependente,
                                    config.desconto_folha
                                }).Take(1);

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ConfiguracaoRegraLegal configLegal = new ConfiguracaoRegraLegal();
                    configLegal.IdConfiguracaoRegraLegal = list.id_configuracao_regra_legal;
                    configLegal.DtInicio = list.dt_inicio;
                    configLegal.DtFim = list.dt_fim;
                    configLegal.Valor = list.valor;
                    configLegal.Obrigatorio = list.obrigatorio;
                    configLegal.ExtensivoDependente = list.extensivo_dependente;
                    configLegal.DescontoFolha = list.desconto_folha;

                    listConfigLegal.Add(configLegal);
                }

                return listConfigLegal;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<ConfiguracaoRegraLegal> SelectHistorico(int idBeneficio)
        {
            try
            {
                List<ConfiguracaoRegraLegal> listConfigLegal = new List<ConfiguracaoRegraLegal>();

                var consulta = (from config in _context.tab_configuracao_regra_legal
                                where config.tab_tipo_beneficio.id_tipo_beneficio == idBeneficio
                                orderby config.id_configuracao_regra_legal descending
                                select new
                                {
                                    config.id_configuracao_regra_legal,
                                    config.dt_inicio,
                                    config.dt_fim,
                                    config.tab_status.id_status,
                                    config.valor,
                                    config.obrigatorio,
                                    config.extensivo_dependente,
                                    config.desconto_folha
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ConfiguracaoRegraLegal configLegal = new ConfiguracaoRegraLegal();
                    configLegal.IdConfiguracaoRegraLegal = list.id_configuracao_regra_legal;
                    configLegal.DtInicio = list.dt_inicio;
                    configLegal.DtFim = list.dt_fim;
                    configLegal.Status = new Status(list.id_status);
                    configLegal.Valor = list.valor;
                    configLegal.Obrigatorio = list.obrigatorio;
                    configLegal.ExtensivoDependente = list.extensivo_dependente;
                    configLegal.DescontoFolha = list.desconto_folha;

                    listConfigLegal.Add(configLegal);
                }

                return listConfigLegal;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos de Persistência
        public void Salvar()
        {
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    VerificarCadastro();

                    if (this._idConfiguracaoRegraLegal == 0)
                    {
                        tab_configuracao_regra_legal tabConfiguracaoRegraLegal = new tab_configuracao_regra_legal();

                        tabConfiguracaoRegraLegal.tab_tipo_beneficioReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_beneficio", "id_tipo_beneficio", this._beneficio.IdTipoBeneficio);
                        tabConfiguracaoRegraLegal.dt_inicio = this._dtInicio;
                        tabConfiguracaoRegraLegal.dt_fim = this._dtFim;
                        tabConfiguracaoRegraLegal.tab_statusReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status", "id_status", this._status.IdStatus);
                        tabConfiguracaoRegraLegal.valor = this._valor;
                        tabConfiguracaoRegraLegal.tab_tipo_valorReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_valor", "id_tipo_valor", this._tipoValor.IdTipoValor);
                        tabConfiguracaoRegraLegal.obrigatorio = this._obrigatorio;
                        tabConfiguracaoRegraLegal.extensivo_dependente = this._extensivoDependente;
                        tabConfiguracaoRegraLegal.desconto_folha = this._descontoFolha;

                        _context.AddTotab_configuracao_regra_legal(tabConfiguracaoRegraLegal);
                        _context.SaveChanges();

                        this._idConfiguracaoRegraLegal = RetornaIdConfiguracaoRegraLegal();
                        DesativarConfiguracaoAnterior(this._idConfiguracaoRegraLegal, this._beneficio.IdTipoBeneficio);
                    }
                    else
                    {
                        tab_configuracao_regra_legal tabConfiguracaoRegraLegal = (from config in _context.tab_configuracao_regra_legal
                                                                                  where config.id_configuracao_regra_legal == this._idConfiguracaoRegraLegal
                                                                                  select config).First();

                        tabConfiguracaoRegraLegal.tab_tipo_beneficioReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_beneficio", "id_tipo_beneficio", this._beneficio.IdTipoBeneficio);
                        tabConfiguracaoRegraLegal.dt_inicio = this._dtInicio;
                        tabConfiguracaoRegraLegal.dt_fim = this._dtFim;
                        tabConfiguracaoRegraLegal.tab_statusReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status", "id_status", this._status.IdStatus);
                        tabConfiguracaoRegraLegal.valor = this._valor;
                        tabConfiguracaoRegraLegal.tab_tipo_valorReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_valor", "id_tipo_valor", this._tipoValor.IdTipoValor);
                        tabConfiguracaoRegraLegal.obrigatorio = this._obrigatorio;
                        tabConfiguracaoRegraLegal.extensivo_dependente = this._extensivoDependente;
                        tabConfiguracaoRegraLegal.desconto_folha = this._descontoFolha;

                        _context.SaveChanges();
                    }

                    scope.Complete();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
        #endregion

        #endregion
    }
}
